﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "QWidget"
#include "QTreeWidget"
#include "src/connect_page/connect_page.h"
#include "src/wave/base_wave_widget.h"
#include "libdaq/backend/usb/usb_backend.h"
#include "src/once_trigger_thread/once_trigger_thread.h"
#include "src/scroll_mode_thread/scroll_mode_thread.h"

#include "libdaq/backend/usb_server/usb_server.h"

// 前向声明
class QComboBox;
class QCheckBox;

using DeviceAddress = uint8_t;
using DeviceMap = std::map<DeviceAddress, std::shared_ptr<libdaq::backend::LockzhinerUSBBackend> >;
using BusNumber = uint8_t;
using BusDeviceMap = std::map<BusNumber, DeviceMap>;
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
  MainWindow(QWidget *parent = nullptr);
  ~MainWindow();
  void UpdatePlotData(int channel);
  void UpdateAutoScale();
private slots:
  void ConnectStatusSlot(bool status, ConnectPage::ConnectType type);
  void ClickConnectAction();
  void ClickStartADCCollectionAction();
  void ClickUpdateConfig();
  void ClickSoftwareTrigger();
  void ClickStopADCCollection();
  void ScrollModeDataReceived(int collection_count); // 滚动模式数据接收槽函数

private:
  void InitWaveWidget();
  void InitSampleRateComboBox(); // 初始化采样率下拉框
  void InitChannelConfiguration(); // 初始化通道配置
  void OnceCollection();  // 单次采集
  void EndOnceCollection(); // 单次采集结束
  void ScrollCollection(); // 滚动模式采集
  void EndScrollCollection(); // 滚动模式采集结束
  bool ConfigADCSampleRate(); // 采样率配置
  bool ConfigADCChannel();  // 通道使能配置
  bool ConfigADCTrigger();  // 触发模式、方式、通道、电平配置
  bool ConfigADCVoltage();  // 电压量程配置
  bool ConfigACDC();        // AC/DC配置
  QVector<bool> GetChannelEnabled(); // 获取通道使能状态
  void CheckAllThreadsFinished(); // 检查所有线程是否已完成
  bool IsScrollMode(); // 判断当前是否为滚动模式
  void UpdateScrollModeData(); // 更新滚动模式数据到波形控件

private:
  Ui::MainWindow *ui;
  QVector<QSharedPointer<OnceTriggerADCThread>> once_trigger_adc_thread_list_; // 单次触发采集数据线程列表
  QSharedPointer<ScrollModeADCThread> scroll_mode_adc_thread_; // 滚动模式采集数据线程
  std::vector<std::vector<float>> adc_data_buffer_; // ADC数据缓冲区

  QSharedPointer<ConnectPage> connect_page_; // 连接页面
  QSharedPointer<libdaq::device::LockzhinerBaseDevice> base_device_;
  QSharedPointer<BaseWaveWidget> base_wave_widget_; // 波形显示控件
  std::shared_ptr<libdaq::backend::LockzhinerBaseBackend> base_backend_ = nullptr; // 服务端
  libdaq::backend::USBOption* usb_option_=nullptr; // USB属性
  std::unique_ptr<libdaq::backend::LockzhinerUSBServer> usb_server_; // USB服务器

  // 动态创建的UI控件列表
  QVector<QComboBox*> voltage_combo_list_; // 电压量程下拉框列表
  QVector<QCheckBox*> ac_dc_checkbox_list_; // AC/DC复选框列表

  int connected_count = 0;  // 连接设备个数
  bool is_start_adc_collection_ = false; // 是否开始采集
  int completed_thread_count_ = 0; // 已完成的线程数量
  double x_start_index_ = 0; // 滚动模式数据起始索引
};
#endif // MAINWINDOW_H
